#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <queue>
#include <algorithm>

using namespace std;

//int main()
//{
//    bool isparastring(string substr)
//    {
//        int i = 0, j = substr.size() - 1;
//        while (i < j) {
//            if (substr[i] != substr[j]) {
//                return false;
//            }
//            i++;
//            j--;
//        }
//        return true;
//    }
//
//    int getLongestPalindrome(string A) {
//        int maxlen = 1;
//        if (A.size() <= 2) {
//            return A.size() == 1 ? 1 : (A[0] == A[1]) + 1;
//        }
//
//        for (int i = 0; i < A.size(); i++) {
//            for (int j = 2; j < A.size(); j++) {
//                string curstr = A.substr(i, j - i + 1);
//                bool ret = isparastring(curstr);
//                if (ret == true) {
//                    maxlen = max(maxlen, j - i + 1);
//                }
//            }
//        }
//        return maxlen;
//    }
//}



class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if (n == 1) { return 0; }
        int curmin = prices[0];
        int ret = 0;
        for (int i = 1; i < n; i++) {
            if (curmin > prices[i])
            {
                curmin = prices[i];
            }
            else
            {
                ret = max(ret, prices[i] - curmin);
            }
        }
        return ret;
    }
};


int n, m, x, y;
long long dp[25][25];

int main()
{
    cin >> n >> m >> x >> y;
    x += 1;
    y += 1;
    dp[0][1] = 1;
    for (int i = 1; i <= n + 1; i++)
    {
        for (int j = 1; j <= m + 1; j++)
        {
            if (i != x && j != y && abs(i - x) + abs(j - y) == 3 || (i == x && j == y))
            {
                dp[i][j] = 0;
            }
            else {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
    }

    cout << dp[n + 1][m + 1];
}




